package com.qf.microuser.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qf.common.core.entity.User;
import com.qf.common.core.entity.UserPointsLog;
import com.qf.common.core.util.DateFormatUtils;
import com.qf.common.core.util.UserUtils;
import com.qf.microuser.user.mapper.UserMapper;
import com.qf.microuser.user.mapper.UserPointsLogMapper;
import com.qf.microuser.user.service.UserPointsLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * 天--道--酬--勤
 *
 * @author LiangGaoQiang
 * @ClassName UserPointsLogServiceImpl
 * @Date: 2025/5/26 20:50
 * @Description: 描述
 */
@Service
public class UserPointsLogServiceImpl implements UserPointsLogService {

    @Autowired
    private UserPointsLogMapper userPointsLogMapper;

    @Autowired
    private UserMapper userMapper;

    @Override
    public Boolean userSign() {
        // 实现用户的签到功能
        // 1. 查询用户是否已经签到
        // 1.1 获取用户的id和当前时间
        Integer uid = UserUtils.getUid();
        // 1.2 根据user表中的字段获取用户最后一次的签到时间和当前时间做比较
        // 这里的日期格式设置成了yyyy-MM-dd
        Date date = new Date();
        String dateStr = DateFormatUtils.format(date, "yyyy-MM-dd");
        User user = userMapper.selectOne(new QueryWrapper<User>().eq("id", uid).eq("last_sign_in_date", dateStr));
        // 判断用户是否已经签到
        if (user != null) {
            // 已经签到，则返回false
            return false;
        }

        // 需要更新user表里的points、last_sign_in_date字段
        // todo：这里如果更新操作失败，不应该影响下面插入积分记录的操作，需要单独处理
        // 首先需要根据用户id查询用户的积分和最后一次签到时间
        User user_select = userMapper.selectById(uid);
        user_select.setPoints(user_select.getPoints() + 100);
        user_select.setLastSignInDate(date);
        // 更新用户的积分和最后一次签到时间
        int user_update = userMapper.updateById(user_select);
        if (user_update <= 0) {
            return false;
        }


        // 创建一个签到记录
        UserPointsLog userPointsLog = new UserPointsLog();
        // 设置签到记录的属性
        userPointsLog.setUserId(uid);
        // 每次签到，积分加100
        userPointsLog.setPointsChange(100);
        // 签到原因
        userPointsLog.setChangeReason("签到奖励");
        // 签到时间
        userPointsLog.setChangeTime(date);

        // 3. 如果没有签到，则插入一条签到记录，并返回结果
        return userPointsLogMapper.insert(userPointsLog) > 0;
    }

    @Override
    public Boolean findSign(Integer uid) {
        // 1. 获取当前时间
        Date date = new Date();
        // 2. 获取当前时间对应的日期字符串
        String dateStr = DateFormatUtils.format(date, "yyyy-MM-dd");
        // 3. 根据用户id和日期字符串查询用户是否已经签到
        User user = userMapper.selectOne(new QueryWrapper<User>().eq("id", uid).eq("last_sign_in_date", dateStr));
        // 4. 如果用户已经签到，则返回true
        if (user != null) {
            return true;
        }
        // 5. 如果用户没有签到，则返回false
        return false;
    }
}
